#ifndef HTTP_RESPONSE_H
#define HTTP_RESPONSE_H

#include "../buffer/buffer.h"

#include <sys/stat.h>
#include <string>
#include <unordered_set>
#include <unordered_map>

class HttpResponse {
public:
    HttpResponse();
    ~HttpResponse();

    void Init(const std::string& srcDir, std::string& path,bool isKeepAlive = false, int code = -1);
    void MakeResponse(Buffer& buff);
    void UnmapFile();
    char* File();
    size_t FileLen() const;
    void ErrorContent(Buffer& buff, std::string message);
    int Code() const { return code_; }

private:
    void AddStateLine_(Buffer& buff);
    void AddHeader_(Buffer& buff);
    void AddContent_(Buffer& buff);

    void ErrorHtml_(); // 错误
    std::string GetFileType_(); // 获取文件类型

private:
    int code_; // Http状态码，用于指示相应的状态
    bool isKeepAlive_; // 用于表示Http是否是持久链接：keep-alive
    
    std::string path_; // resource资源的路径（相对于srcDir）
    std::string srcDir_; // 资源文件目录
    
    char* mmFile_; // 指向内存映射文件的指针（将需要的文件映射到内存中，以此可以提高文件的访问效率）
    struct stat mmFileStat_; // 存储内存映射文件的状态信息

    static const std::unordered_map<std::string, std::string> SUFFIX_TYPE;
    static const std::unordered_map<int, std::string> CODE_STATUS;
    static const std::unordered_map<int, std::string> CODE_PATH;
};

#endif